package ku.cat;

import java.io.IOException;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Preview  extends SurfaceView implements SurfaceHolder.Callback {
	// private static final String TAG = "Preview";
	private static final String TAG = "CAT";

	SurfaceHolder mHolder;
	public Camera camera;

	Preview(Context context) {
		super(context);

		// Install a SurfaceHolder.Callback so we get notified when the
		// underlying surface is created and destroyed.
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceCreated(SurfaceHolder holder) {
		// The Surface has been created, acquire the camera and tell it where
		// to draw.
		if (camera == null) {

			camera = Camera.open();

			try {
				camera.setPreviewDisplay(holder);
				//
				// // camera.setPreviewCallback(new PreviewCallback() {
				// //
				// // public void onPreviewFrame(byte[] data, Camera arg1) {
				// // FileOutputStream outStream = null;
				// // try {
				// // outStream = new FileOutputStream(String.format(
				// // "/sdcard/%d.jpg", System.currentTimeMillis()));
				// // outStream.write(data);
				// // outStream.close();
				// // Log.d(TAG, "onPreviewFrame - wrote bytes: "
				// // + data.length);
				// // } catch (FileNotFoundException e) {
				// // e.printStackTrace();
				// // } catch (IOException e) {
				// // e.printStackTrace();
				// // } finally {
				// // }
				// // Preview.this.invalidate();
				// // }
				// });
			} catch (IOException e) {
				camera.release();
				camera = null;
				e.printStackTrace();
			}
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		// Surface will be destroyed when we return, so stop the preview.
		// Because the CameraDevice object is not a shared resource, it's very
		// important to release it when the activity is paused.
		Log.d(TAG, "surfaceDestory");
		if (camera != null) {
			camera.stopPreview();
			camera.setPreviewCallback(null);
			camera.release();
			camera = null;
		}
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		// Now that the size is known, set up the camera parameters and begin
		// the preview.
		Log.d(TAG, "surfaceChanged");
		Camera.Parameters parameters = camera.getParameters();
		// Log.d(TAG, "" + parameters);
		// Log.d(TAG, "W " + w + " H " + h);
		// parameters.setPreviewSize(w, h);
		// parameters.setPreviewSize(800, 480);

		List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();

		if (previewSizes == null) {
			Log.w(TAG, "previewSizes == null");
		} else {
			// for (Size size : previewSizes) {
			// Log.d(TAG, size.height + " " + size.width);
			// }
			Camera.Size preview = previewSizes.get(5);
			Log.d(TAG, "Use: W " + preview.width + " H " + preview.height);
			parameters.setPreviewSize(preview.width, preview.height);
		}

		// Log.d(TAG, preview.height + "");

		// parameters.setPreviewSize(425, 300);

		// Log.d(TAG, parameters.getPreviewSize() + "");
		camera.setParameters(parameters);
		camera.startPreview();
	}

	@Override
	public void draw(Canvas canvas) {
		super.draw(canvas);
		Paint p = new Paint(Color.RED);
		Log.d(TAG, "draw");
		canvas.drawText("PREVIEW", canvas.getWidth() / 2,
				canvas.getHeight() / 2, p);
	}
}
